home *** CD-ROM | disk | FTP | other *** search
- /* PC98<->IBM<->FMR ファイル転送 for FMR Copyright (c) E.Suto , 1992-1993 */
- /* 修正履歴 Ver 0.00 1992/06/22 試作品 */
- /* Ver 0.10 1992/06/23 近所公開版 */
- /* Ver 0.20 1992/06/26 簡易サーバーモード追加,共用ドライブ対応*/
- /* Ver 0.21 1992/06/28 リモートコマンド追加 */
- /* Ver 0.30 1992/07/01 TIMEOUT()改造,オプション統合,速度表示 */
- /* Ver 0.31 1992/07/03 簡易サーバーを出来るだけ止めないよう */
- /* Ver 0.32 1992/07/03 速度表示の0割り算ガード(超手抜き) */
- /* Ver 0.33 1992/07/06 . の消し方変更 */
- /* Ver 0.34 1992/07/10 受信ファイルがルートに行ってしまうバグ修正 */
- /* Ver 0.35 1992/11/17 RS232Cのバグ修正(98版のみ) */
- /* Ver 0.36 1992/11/17 ちょっと高速化(^^; */
- /* Ver 0.37 1992/11/18 タイマ値最適化 */
- /* Ver 0.38 1992/11/18 送信ファイル名バグ修正 */
- /* Ver 0.39 1992/11/18 サーバーバグ修正 */
- /* Ver 0.40 1993/02/04 FMR版作成 */
- /* Ver 0.41 1993/02/04 inpのwaitを#defineに */
- /* Ver 0.42 1993/02/04 ソースをちょっと統合(^^; */
- /* Ver 1.00 1993/ 2/ 3 失敗時にタイムアウトしない */
- /* Ver 1.01 1993/ 2/ 4 コマンド受信処理でタイムアウトしない */
-
- #include "iplink.h"
-
- #define RS_IN 0x0a04
- #define RS_OUT 0x0a02
- #define PALAWAIT 0l /* TIMEOUTが発生する場合はこの値を大きくしてね(^^; */
-
- void main(int argc,char *argv[])
- {
- int i , k , l , m ;
- unsigned char *c ;
-
- debug = 0 ;
- mode = -1 ;
- strcpy( command , "" ) ;
- strcpy( path , "" ) ;
-
- /* コピーライト表示 */
- copyright() ;
-
- /* 割り込み処理定義 */
- signal( SIGINT , sig_out ) ;
-
- /* オプションチェック */
- if( argc < 2 ) {
- usage() ;
- exit( 0 ) ;
- }
- else {
- k = l = 0 ;
- for( i=1 ; i<argc ; i++ ) {
- c = argv[i] ;
- if( *c == '-' || *c == '/' ) {
- switch( *++c ) {
- case '?' :
- usage();
- exit( 0 );
- case 'i' :
- case 'I' :
- debug = -1 ;
- break ;
- case 'R' :
- case 'r' :
- if( k ) mode = 4 ;
- else mode = 1 ;
- break ;
- case 'S' :
- case 's' :
- mode = 0 ;
- break ;
- case 'Z' :
- case 'z' :
- mode = 2 ;
- break ;
- case 'C' :
- case 'c' :
- mode = 5 ;
- c++ ;
- strcpy( command , c ) ;
- if( command[0] == '"' ) {
- for( ; i < argc ; ) {
- i++ ;
- strcat( command , " " ) ;
- strcat( command , argv[i] ) ;
- if( command[strlen( command ) - 1 ] == '"' )
- break ;
- }
- }
- break ;
- case 'X' :
- case 'x' :
- c++ ;
- strcpy( path , c ) ;
- l = -1 ;
- break ;
- default :
- perr: printf( "ファイル名が2つ以上指定されているか、誤ったパラメタ(%s)が指定されています。\n" , argv[i] ) ;
- usage() ;
- exit( -1 ) ;
- }
- }
- else {
- if( mode == 5 ) {
- if( strlen( command ) > 0 ) goto perr ;
- strcpy( command , c ) ;
- if( command[0] == '"' ) {
- for( ; i < argc ; ) {
- i++ ;
- strcat( command , " " ) ;
- strcat( command , argv[i] ) ;
- if( command[strlen( command ) - 1 ] == '"' )
- break ;
- }
- }
- else {
- for( ; i < argc ; ) {
- i++ ;
- if( ( *(argv[i]) == '-' ) || ( *(argv[i]) == '/' ) )
- break ;
- strcat( command , " " ) ;
- strcat( command , argv[i] ) ;
- }
- }
- }
- else {
- if( k ) goto perr ;
- strcpy( name , argv[i] ) ;
- k = -1 ;
- if( mode == 1 ) mode = 4 ;
- }
- }
- }
- }
-
- /* オプションの関連チェック */
- if( mode == -1 ) {
- printf( "-r,-s,-z又は-c,の何れかを指定してください。\n" ) ;
- usage() ;
- exit( -1 ) ;
- }
- if( !( k ) && ( mode == 0 ) ) {
- printf( "-s指定時にはファイル名を省略できません。\n" ) ;
- usage() ;
- exit( -1 ) ;
- }
- if( l && ( mode != 0 ) ) {
- printf( "-s 指定時以外にはでは、-xは指定できません。\n" ) ;
- usage() ;
- exit( -1 ) ;
- }
- if( mode == 5 ) {
- strcpy( buffer , command ) ;
- if( buffer[0] == '"' ) {
- m = strlen( buffer ) ;
- if( buffer[m-1] != '"' ) {
- printf( " コマンドの終わりを示す\"が不足しています。(%s)\n",buffer ) ;
- usage() ;
- exit( -1 ) ;
- }
- buffer[m-1] = 0x00 ;
- strcpy( command , ( buffer + 1 ) ) ;
- }
- if( strlen( command ) == 0 ) {
- printf( "-c に続いてリモートコマンドを指定してください。\n" ) ;
- usage() ;
- exit( -1 ) ;
- }
- if( strlen( command ) > 114 ) {
- printf( "申し訳有りませんがコマンドが長すぎます。114文字以下にしてください。\n" ) ;
- usage() ;
- exit( -1 ) ;
- }
- }
-
- /* タイムアウト値設定 */
- timeset() ;
-
- /* 回線の初期化 */
- rs_init() ;
-
- /* 送受信処理へ */
- switch( mode ) {
- case 0 : /* 送信処理 */
- connect_s() ;
- fp_send() ;
- break ;
- case 1 : /* 受信処理 */
- connect_r() ;
- fp_receive0() ;
- fp_receive() ;
- break ;
- case 2 : /* サーバー処理 */
- fp_server() ;
- break ;
- case 4 : /* サーバーからの受信処理 */
- connect_s() ;
- fp_file() ;
- fp_receive0() ;
- fp_receive() ;
- break ;
- case 5 : /* リモートコマンド処理 */
- connect_s() ;
- fp_command() ;
- break ;
- }
-
- /* 後始末 */
- printf( "電送処理終了しました。\n" ) ;
- rs_init() ;
-
- }
-
- /* 接続確認待ち(送信型)*/
- int connect_s()
- {
- unsigned char stat ;
-
- /* 接続確認 */
- if( mode != 2 ) printf( "接続待ちです。\n" ) ;
- outp( RS_OUT , 0x02 ) ; /* ずーと待つからsendは使わない */
- stat = 0x01 ;
- while( ( inp( RS_IN ) & 0x03 ) != stat ) {
- printf( "*\r" ) ;
- if( kbhit() ) {
- if( getch() == 0x1b ) sig_out() ;
- }
- }
-
- outp( RS_OUT , 0x20 ) ; /* ずーと待つからsendは使わない */
- stat = 0x02 ;
- while( ( inp( RS_IN ) & 0x03 ) != stat ) {
- printf( "*\r" ) ;
- if( kbhit() ) {
- if( getch() == 0x1b ) sig_out() ;
- }
- }
-
- buffer[0] = 0xe4 ; /* このへんの文字は何でも良い(^^; */
- if ( send( 1 , buffer ) ) {
- if( mode == 2 ) return( -1 ) ;
- timeout() ;
- }
- if( debug ) printf( "送信接続OK。\n" ) ;
- return( 0 ) ;
-
- }
-
- /* 回線送信処理 */
- int send( int l , unsigned char *b )
- {
- int i ;
- long k ;
- unsigned char stat0,stat1,data ;
-
- /* 1バイトを8つに区切って1ビット毎に送信 */
- for( i = 0 ; i < l ; i++ ) {
- /* ビット7送信 */
- data = 0x00 ;
- stat0 = 0x00 ;
- if( (*b) & 0x80 ) {
- data |= 0x02 ;
- stat0 |= 0x01 ;
- }
- outp( RS_OUT , data ) ;
- /* ビット6送信 */
- data = 0x20 ;
- stat1 = 0x02 ;
- if( (*b) & 0x40 ) {
- data |= 0x02 ;
- stat1 |= 0x01 ;
- }
- for( k = timeout1 ; ( inp( RS_IN ) & 0x03 ) != stat0 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- outp( RS_OUT , data ) ;
- /* ビット5送信 */
- data = 0x00 ;
- stat0 = 0x00 ;
- if( (*b) & 0x20 ) {
- data |= 0x02 ;
- stat0 |= 0x01 ;
- }
- for( k = timeout1 ; ( inp( RS_IN ) & 0x03 ) != stat1 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- outp( RS_OUT , data ) ;
- /* ビット4送信 */
- data = 0x20 ;
- stat1 = 0x02 ;
- if( (*b) & 0x10 ) {
- data |= 0x02 ;
- stat1 |= 0x01 ;
- }
- for( k = timeout1 ; ( inp( RS_IN ) & 0x03 ) != stat0 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- outp( RS_OUT , data ) ;
- /* ビット3送信 */
- data = 0x00 ;
- stat0 = 0x00 ;
- if( (*b) & 0x08 ) {
- data |= 0x02 ;
- stat0 |= 0x01 ;
- }
- for( k = timeout1 ; ( inp( RS_IN ) & 0x03 ) != stat1 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- outp( RS_OUT , data ) ;
- /* ビット2送信 */
- data = 0x20 ;
- stat1 = 0x02 ;
- if( (*b) & 0x04 ) {
- data |= 0x02 ;
- stat1 |= 0x01 ;
- }
- for( k = timeout1 ; ( inp( RS_IN ) & 0x03 ) != stat0 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- outp( RS_OUT , data ) ;
- /* ビット1送信 */
- data = 0x00 ;
- stat0 = 0x00 ;
- if( (*b) & 0x02 ) {
- data |= 0x02 ;
- stat0 |= 0x01 ;
- }
- for( k = timeout1 ; ( inp( RS_IN ) & 0x03 ) != stat1 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- outp( RS_OUT , data ) ;
- /* ビット0送信 */
- data = 0x20 ;
- stat1 = 0x02 ;
- if( (*b) & 0x01 ) {
- data |= 0x02 ;
- stat1 |= 0x01 ;
- }
- for( k = timeout1 ; ( inp( RS_IN ) & 0x03 ) != stat0 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- outp( RS_OUT , data ) ;
- for( k = timeout1 ; ( inp( RS_IN ) & 0x03 ) != stat1 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- /* 次のバイト処理へ */
- b++ ;
- }
- return( 0 ) ;
-
- }
-
- /* 接続確認待ち(受信型)*/
- int connect_r()
- {
- unsigned char stat ;
-
- /* 接続確認 */
- if( mode != 2 ) printf( "接続待ちです。\n" ) ;
- stat = 0x01 ;
- while( ( inp( RS_IN ) & 0x03 ) != stat ) {
- printf( "*\r" ) ;
- if( kbhit() ) {
- if( getch() == 0x1b ) sig_out() ;
- }
- }
- outp( RS_OUT , 0x02 ) ; /* ずっと待ちたいからreceiveを使わない */
-
- stat = 0x02 ;
- while( ( inp( RS_IN ) & 0x03 ) != stat ) {
- printf( "*\r" ) ;
- if( kbhit() ) {
- if( getch() == 0x1b ) sig_out() ;
- }
- }
- outp( RS_OUT , 0x20 ) ; /* ずっと待ちたいからreceiveを使わない */
-
- if( receive( 1 , buffer ) ) {
- if( mode == 2 ) return( -1 ) ;
- timeout() ;
- }
- if( buffer[0] != 0xe4 ) { /* このへんの文字は送信側に合わせる */
- printf( "接続確認処理でエラーが発生しました。\n" ) ;
- if( mode == 2 ) return( -1 ) ;
- rs_init() ;
- exit( -1 ) ;
- }
- if( debug ) printf( "受信接続OK。\n" ) ;
- return( 0 ) ;
-
- }
-
- /* 回線受信処理 */
- int receive( int l , unsigned char *b )
- {
- int i ;
- long k , t ;
- unsigned char data ;
-
- /* 1ビットを8つ受信で1バイト */
- for( i = 0 ; i < l ; i++ ) {
- *b = 0x00 ;
- /* ビット7受信 */
- for( k = timeout1 ; inp( RS_IN ) & 0x02 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
- data = 0x00 ;
- if( inp( RS_IN ) & 0x01 ) {
- (*b) |= 0x80 ;
- data |= 0x02 ;
- }
- outp( RS_OUT , data ) ;
- /* ビット6受信 */
- for( k = timeout1 ; !(inp( RS_IN ) & 0x02) ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
- data = 0x20 ;
- if( inp( RS_IN ) & 0x01 ) {
- (*b) |= 0x40 ;
- data |= 0x02 ;
- }
- outp( RS_OUT , data ) ;
- /* ビット5受信 */
- for( k = timeout1 ; inp( RS_IN ) & 0x02 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
- data = 0x00 ;
- if( inp( RS_IN ) & 0x01 ) {
- (*b) |= 0x20 ;
- data |= 0x02 ;
- }
- outp( RS_OUT , data ) ;
- /* ビット4受信 */
- for( k = timeout1 ; !(inp( RS_IN ) & 0x02) ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
- data = 0x20 ;
- if( inp( RS_IN ) & 0x01 ) {
- (*b) |= 0x10 ;
- data |= 0x02 ;
- }
- outp( RS_OUT , data ) ;
- /* ビット3受信 */
- for( k = timeout1 ; inp( RS_IN ) & 0x02 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
- data = 0x00 ;
- if( inp( RS_IN ) & 0x01 ) {
- (*b) |= 0x08 ;
- data |= 0x02 ;
- }
- outp( RS_OUT , data ) ;
- /* ビット2受信 */
- for( k = timeout1 ; !(inp( RS_IN ) & 0x02) ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
- data = 0x20 ;
- if( inp( RS_IN ) & 0x01 ) {
- (*b) |= 0x04 ;
- data |= 0x02 ;
- }
- outp( RS_OUT , data ) ;
- /* ビット1受信 */
- for( k = timeout1 ; inp( RS_IN ) & 0x02 ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
- data = 0x00 ;
- if( inp( RS_IN ) & 0x01 ) {
- (*b) |= 0x02 ;
- data |= 0x02 ;
- }
- outp( RS_OUT , data ) ;
- /* ビット0受信 */
- for( k = timeout1 ; !(inp( RS_IN ) & 0x02) ; k-- ) {
- if( !( k ) ) return( -1 ) ;
- }
- for( t = 0l ; t < PALAWAIT ; t++ ) ; /* (;_;) */
- data = 0x20 ;
- if( inp( RS_IN ) & 0x01 ) {
- (*b) |= 0x01 ;
- data |= 0x02 ;
- }
- outp( RS_OUT , data ) ;
- /* 次のバイト処理へ */
- b++ ;
- }
- return( 0 ) ;
-
- }
-
- /* 8251の初期化 */
- void rs_init()
- {
- int i , j ;
-
- /* 状態のリセット */
- for( i = 0 ; i < 3 ; i++ ) {
- outp( RS_OUT , 0x00 ) ;
- for( j = 0 ; j < 3 ; j++ ) ; /* 念のため時間待ち */
- }
- outp( RS_OUT , 0x40) ;
-
- /* モードセット */
- outp( RS_OUT , 0x4e) ;
- for( j = 0 ; j < 6 ; j++ ) ; /* 念のため時間待ち */
-
- /* エラーリセット */
- outp( RS_OUT , 0x37) ;
- for( j = 0 ; j < 6 ; j++ ) ; /* 念のため時間待ち */
-
- }
-
- /* コピーライト表示 */
- void copyright()
- {
- printf(
- "IBM<=>98<=>FMR ファイル電送 for FMR Ver 1.01, Copyright (C) E.Suto , 1992-1993\n"
- ) ;
- }
-
- /* 使い方表示 */
- void usage()
- {
- printf( "使用法 : IPLINKF [options] [file-name]\n" ) ;
- printf( "オプション -s : ファイル送信(要送信ファイル名)\n" ) ;
- printf( " -r : ファイル受信\n" ) ;
- printf( " -z : サーバーモード\n" ) ;
- printf( " -cリモートコマンド : サーバーにリモートコマンドを送信\n" ) ;
- printf( " -x[path_name] : -sでの格納先パス名\n" ) ;
- printf( " -i : 詳細情報表示\n" ) ;
- }
-